﻿using System.Collections.Generic;
using NHibernate;
using NHibernate.Criterion;
using Neturion.Dados;
using Neturion.IRepositorios;

namespace Neturion.Repositorios
{
    public class RepositorioMidia : IRepositorioMidia
    {
        public Midia Inserir(Midia midia)
        {
            midia.FimVigencia = midia.FimVigencia.HasValue
                                    ? midia.FimVigencia.GetValueOrDefault().Date
                                    : midia.FimVigencia;
            midia.InicioVigencia = midia.InicioVigencia.HasValue
                                        ? midia.InicioVigencia.GetValueOrDefault().Date
                                        : midia.InicioVigencia;

            GerenciadorBDConfigs.Instance.SessaoAtual().Save(midia);
            return midia;
        }

        public Midia Atualizar(Midia midia)
        {
            Midia tmpMidia = ObterPorId(midia.MidiaId);
            // Atribuicao dos valores do objeto da memoria para o objeto obtido no banco de dados
            tmpMidia.Codigo = midia.Codigo;
            tmpMidia.Descricao = midia.Descricao;
            tmpMidia.FimVigencia = midia.FimVigencia.HasValue
                                    ? midia.FimVigencia.GetValueOrDefault().Date
                                    : midia.FimVigencia;
            tmpMidia.InicioVigencia = midia.InicioVigencia.HasValue
                                        ? midia.InicioVigencia.GetValueOrDefault().Date
                                        : midia.InicioVigencia;
            tmpMidia.Fornecedor = midia.Fornecedor;
            tmpMidia.NeturionLog = midia.NeturionLog;
            tmpMidia.Observacao = midia.Observacao;
            tmpMidia.TipoMidia = midia.TipoMidia;

            GerenciadorBDConfigs.Instance.SessaoAtual().Merge(tmpMidia);
            return tmpMidia;
        }

        public void Excluir(Midia midia)
        {
            GerenciadorBDConfigs.Instance.SessaoAtual().Delete(midia);
        }

        public IList<Midia> ObterTodos()
        {
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Midia));
            return criteria.List<Midia>() as List<Midia>;
        }

        public Midia ObterPorId(int id)
        {
            return GerenciadorBDConfigs.Instance.SessaoAtual().Get<Midia>(id);
        }

        public Midia ObterPorCodigo(string codigo)
        {
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Midia))
                .Add(Restrictions.Eq("Codigo",codigo));
            return criteria.UniqueResult<Midia>();
        }

        public IList<Midia> ObterPorDescricao(int inicio, int quantidade, int quantidadeMinima, string descricao)
        {
            if (quantidade.Equals(0))
            {
                quantidade = quantidadeMinima;
            }

            IList<OrgaoExpedidor> list;
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Midia))
               .SetFirstResult(inicio).SetMaxResults(quantidade);
            
            criteria.Add(Restrictions.Like("Descricao",descricao,MatchMode.Anywhere));
            return criteria.List<Midia>() as List<Midia>;
        }

        public IList<Midia> ObterPorTipoMidia(int inicio, int quantidade, int quantidadeMinima, TipoMidia tipoMidia)
        {
           if (quantidade.Equals(0))
            {
                quantidade = quantidadeMinima;
            }

            IList<OrgaoExpedidor> list;
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Midia))
               .SetFirstResult(inicio).SetMaxResults(quantidade);
            
            criteria.Add(Restrictions.Eq("TipoMidia", tipoMidia));
            return criteria.List<Midia>() as List<Midia>;
        }

        public IList<Midia> ObterPorFornecedor(int inicio, int quantidade, int quantidadeMinima, Fornecedor fornecedor)
        {
           if (quantidade.Equals(0))
            {
                quantidade = quantidadeMinima;
            }

            IList<OrgaoExpedidor> list;
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Midia))
               .SetFirstResult(inicio).SetMaxResults(quantidade);
            
            criteria.Add(Restrictions.Eq("Fornecedor", fornecedor));
            return criteria.List<Midia>() as List<Midia>;
        }

        public int ObterUltimoIdCodigoInteiro()
        {
            string[] literal = new string[] 
                {"a","b","c","d","e","f","g","h","i","j"
                ,"l","m","n","o","p","q","r","s","t","u","v","x","z","y"
                ,"w"};

            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Midia)).SetMaxResults(1);

            for (int i = 0; i <= literal.Length - 1; i++)
            {
                criteria.Add(Restrictions.Not(Restrictions.Like("Codigo", literal[i], MatchMode.Anywhere)));
            }

            criteria.AddOrder(Order.Desc("MidiaId"));


            Midia midia = criteria.UniqueResult<Midia>();
            int ultimoCodigo = midia != null ? midia.MidiaId : 0;

            return ultimoCodigo;
        }
    }
}